package com.tangsm.spring.boot.strategy.demo.service.impl;

import cn.hutool.core.util.StrUtil;
import com.tangsm.spring.boot.strategy.demo.factory.SendMessageBeanFactory;
import com.tangsm.spring.boot.strategy.demo.factory.SendMessageContext;
import com.tangsm.spring.boot.strategy.demo.factory.SendMessageProcessor;
import com.tangsm.spring.boot.strategy.demo.domain.Message;
import com.tangsm.spring.boot.strategy.demo.enums.MessageTypeEnum;
import com.tangsm.spring.boot.strategy.demo.service.MessageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 消息（短信、邮件）
 *
 * @author lakala
 * @date 2021/7/12 11:06
 */
@Service
public class MessageServiceImpl implements MessageService {
    /**
     * 发送消息执行器
     */
    @Autowired
    private SendMessageContext sendMessageContext;

    /**
     * 发送消息执行器
     */
    @Autowired
    private SendMessageProcessor sendMessageProcessor;

    /**
     * 发送消息执行器
     */
    @Autowired
    private SendMessageBeanFactory sendMessageBeanFactory;


    /**
     * 发送消息验证码接口
     *
     * @param message 消息参数
     * @return 响应结果
     */
    @Override
    public String send(Message message) {
        if(!typeValidate(message.getType())) {
            return String.format("不支持%s类型消息发送", message.getType());
        }
        return sendMessageProcessor.getInstance(message.getType()).send(message);
    }

    /**
     * 发送消息验证码接口
     *
     * @param message 消息参数
     * @return 响应结果
     */
    @Override
    public String sendPro(Message message) {
        if (!typeValidate(message.getType())) {
            return String.format("不支持%s类型消息发送", message.getType());
        }
        return sendMessageContext.getInstance(message.getType()).send(message);
    }

    /**
     * 发送消息验证码接口Plus
     *
     * @param message 消息参数
     * @return 响应结果
     */
    @Override
    public String sendPlus(Message message) {
        if (!typeValidate(message.getType())) {
            return String.format("不支持%s类型消息发送", message.getType());
        }
        return sendMessageBeanFactory.getInstance(message.getType()).send(message);
    }

    /**
     * 判断消息类型是否符合条件
     * @param type 消息类型
     * @return true-符合，false-符合
     */
    private boolean typeValidate(String type) {
        return StrUtil.isNotBlank(MessageTypeEnum.getNameByCode(type));
    }
}
